/*
 * %Z%file      %M%
 * %Z%author    Sun Microsystems, Inc.
 * %Z%version   %I%
 * %Z%date      %D%
 *
 * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 */


package com.sun.jmx.snmp.IPAcl;



import java.util.Vector;
import java.util.Enumeration;
import java.io.Serializable;
import java.net.UnknownHostException;


import java.security.Principal; 
import java.security.acl.Group; 


/**
 * This class is used to represent a subnet mask (a group of hosts 
 * matching the same 
 * IP mask).
 * 
 * @version     %I%     %G%
 * @author      Sun Microsystems, Inc
 */

class GroupImpl extends PrincipalImpl implements Group, Serializable {
  
  /**
   * Constructs an empty group.
   * @exception UnknownHostException Not implemented
   */
  public GroupImpl () throws UnknownHostException {
  }
  
  /**
   * Constructs a group using the specified subnet mask.
   *
   * @param mask The subnet mask to use to build the group.
   * @exception UnknownHostException if the subnet mask cann't be built.
   */
  public GroupImpl (String mask) throws UnknownHostException {
	super(mask);
  }
  
    /**
     * Adds the specified member to the group. 
     *
     * @param p the principal to add to this group. 
     * @return true if the member was successfully added, false if the 
     *     principal was already a member. 
     */
    public boolean addMember(Principal p) {
	// we don't need to add members because the ip address is a 
	// subnet mask 
	return true;	
    }

  public int hashCode() {
	return super.hashCode();	
  }
  
  /**
   * Compares this group to the specified object. Returns true if the object
   * passed in matches the group represented.
   *
   * @param p the object to compare with.
   * @return true if the object passed in matches the subnet mask, 
   *   false otherwise.
   */
  public boolean equals (Object p) {
	if (p instanceof PrincipalImpl || p instanceof GroupImpl){
	  if ((super.hashCode() & p.hashCode()) == p.hashCode()) return true;
	  else return false;
	} else {
	  return false;
	}
  }
  
  /**
   * Returns true if the passed principal is a member of the group.
   *
   * @param p the principal whose membership is to be checked.
   * @return true if the principal is a member of this group, false otherwise. 
   */
  public boolean isMember(Principal p) {
	if ((p.hashCode() & super.hashCode()) == p.hashCode()) return true;
	else return false;
  }
  
  /**
   * Returns an enumeration which contains the subnet mask.
   *
   * @return an enumeration which contains the subnet mask.
   */
  public Enumeration members(){
	Vector v = new Vector(1);
	v.addElement(this);
	return v.elements();
  }
  
  /**
   * Removes the specified member from the group. (Not implemented)
   *
   * @param p the principal to remove from this group.
   * @return allways return true.
   */
  public boolean removeMember(Principal p) {
	return true;
  }
  
  /**
   * Prints a string representation of this group.
   *
   * @return  a string representation of this group.
   */
  public String toString() {
	return ("GroupImpl :"+super.getAddress().toString());
  }
}


